/**
 * @param {Function} success 查询成功的回调
 */
class Query {
  // position:[114, 30];
  // service = {
  //   name: "myTestMap",
  //   layerId: 2
  // }
  // 查询以某个点为中心的搜索半径为2的，范围内，所包含的某地图服务的某图层的要素
  // 【点查询（可设置搜索半径），需提供准备好的点坐标数组】
  static queryByPoint({ position, service, success }) {
    var pointObj = new Zondy.Object.Point2D(position[0], position[1]);
    //设置查询点的搜索半径
    pointObj.nearDis = 2;

    /* 1、设置查询结构 */
    //初始化查询结构对象，设置查询结构包含几何信息
    var queryStruct = new Zondy.Service.QueryFeatureStruct();
    //是否包含几何图形信息
    queryStruct.IncludeGeometry = true;
    //是否包含属性信息
    queryStruct.IncludeAttribute = true;
    //是否包含图形显示参数
    queryStruct.IncludeWebGraphic = false;
    /* 2、设置查询规则 */
    var rule = new Zondy.Service.QueryFeatureRule({
      //是否将要素的可见性计算在内
      EnableDisplayCondition: false,
      //是否完全包含
      MustInside: false,
      //是否仅比较要素的外包矩形
      CompareRectOnly: false,
      //是否相交
      Intersect: true,
    });
    /* 3、设置查询参数 */
    //实例化查询参数对象
    var queryParam = new Zondy.Service.QueryParameter({
      geometry: pointObj,
      resultFormat: "json",
      struct: queryStruct,
      rule: rule,
    });
    //设置查询分页号
    queryParam.pageIndex = 0;
    //设置查询要素数目
    queryParam.recordNumber = 1000;
    /* 4、调用查询服务 */
    //实例化地图文档查询服务对象
    var queryService = new Zondy.Service.QueryDocFeature(
      queryParam,
      service.name,
      service.layerId,
      {} // 第三个参数这里，传一个空对象即可
      /* { // 或者写全地图服务的ip和端口号
        ip: 'localhost',
        port: 6163,
      } */
    );
    //执行查询操作，querySuccess为查询回调函数
    queryService.query(this.querySuccess(success));
  }
  //geometry是 ol的要素的属性参数
  //【点、圆、线、多边形等各种几何查询，需提供准备好的geometry对象】
  static queryByGeom({ geometry, service, success }) {
    // 1.
    const type = geometry.getType();
    // console.log(type, "type"); // 'Circle
    let geomObj = null;
    if (type === "Point") {
      geomObj = new Zondy.Object.Point2D();
      //设置查询点的搜索半径
      geomObj.nearDis = 3;
    } else if (type === "Circle") {
      geomObj = new Zondy.Object.Circle();
    } else if (type === "Polygon") {
      geomObj = new Zondy.Object.Polygon();
    } else if (type === "LineString") {
      geomObj = new Zondy.Object.PolyLine();
    }
    geomObj.setByOL(geometry);
    // 2.
    var queryStruct = new Zondy.Service.QueryFeatureStruct();
    //是否包含几何图形信息
    queryStruct.IncludeGeometry = true;
    //是否包含属性信息
    queryStruct.IncludeAttribute = true;
    //是否包含图形显示参数
    queryStruct.IncludeWebGraphic = false;
    // 3.
    //指定查询规则
    var rule = new Zondy.Service.QueryFeatureRule({
      //是否将要素的可见性计算在内
      EnableDisplayCondition: false,
      //是否完全包含
      MustInside: false,
      //是否仅比较要素的外包矩形
      CompareRectOnly: false,
      //是否相交
      Intersect: true,
    });
    // 4.
    //实例化查询参数对象
    var queryParam = new Zondy.Service.QueryParameter({
      geometry: geomObj, // 1.
      resultFormat: "json",
      struct: queryStruct, // 2.
      rule: rule, // 3.
    });
    //设置查询分页号
    queryParam.pageIndex = 0;
    //设置查询要素数目
    queryParam.recordNumber = 1000;
    // 5.
    //实例化地图文档查询服务对象
    var queryService = new Zondy.Service.QueryDocFeature(
      queryParam,
      service.name,
      service.layerId,
      {}
    );
    // 6.
    //执行查询操作，success为查询回调函数
    queryService.query(this.querySuccess(success));
  }
  // 【查询某个地图服务的某个图层上的所有要素。只需提供地图服务(名字和图层索引)】
  /* server{name:string,layerId:number|array} */
  static queryByLayer({ service, success }) {
    // 1.
    var queryStruct = new Zondy.Service.QueryFeatureStruct();
    //是否包含几何图形信息
    queryStruct.IncludeGeometry = true;
    //是否包含属性信息
    queryStruct.IncludeAttribute = true;
    //是否包含图形显示参数
    queryStruct.IncludeWebGraphic = false;
    // 2.
    var rule = new Zondy.Service.QueryFeatureRule({
      //是否将要素的可见性计算在内
      EnableDisplayCondition: false,
      //是否完全包含
      MustInside: false,
      //是否仅比较要素的外包矩形
      CompareRectOnly: false,
      //是否相交
      Intersect: true,
    });
    // 3.
    //实例化查询参数对象
    var queryParam = new Zondy.Service.QueryParameter({
      resultFormat: "json",
      struct: queryStruct,
      rule: rule,
    });
    // (如果要素特别多，默认只能一页查到前20个。)且一次只能查一页
    //设置查询分页号（这个值表示要查的是第几页（从0开始））// 默认是0
    queryParam.pageIndex = 0;
    //设置查询要素数目// 这个值默认是20.表示每页的最大数据数。
    queryParam.recordNumber = 1000;
    // 4.
    //实例化地图文档查询服务对象
    var queryService = new Zondy.Service.QueryDocFeature(
      queryParam,
      service.name,
      service.layerId,
      {}
    );
    // 5.
    //执行查询操作，querySuccess为查询回调函数
    queryService.query(this.querySuccess(success));
  }
  // hyy的修改：此处修改了老师封装的代码参数，keyword参数改为where参数
  // where参数的类型为一个字符串，写一个sql查询语句
  // 例如：
  // 精确匹配：// queryParam.where = "字段名 = '值'";
  // 模糊匹配（包含关键字）: // queryParam.where = "字段名 like '%关键字%'"
  // 多个条件的组合：// queryParam.where = "条件1 AND 条件2";
  // 多个条件的组合：// queryParam.where = "条件1 OR 条件2";
  static queryByAttr({
    // keyword,
    where,
    service,
    success,
  }) {
    // 1.设置查询结果参数
    var queryStruct = new Zondy.Service.QueryFeatureStruct();
    //是否包含几何图形信息
    queryStruct.IncludeGeometry = true;
    //是否包含属性信息
    queryStruct.IncludeAttribute = true;
    //是否包含图形显示参数
    queryStruct.IncludeWebGraphic = false;
    // 2.
    //实例化查询参数对象
    var queryParam = new Zondy.Service.QueryParameter({
      resultFormat: "json",
      struct: queryStruct,
      // 此处就不需要，查询规则，和，查询几何这两个配置项了。
    });
    //设置查询分页号（这两个值默认为 0 和 20）
    queryParam.pageIndex = 0;
    //设置查询要素数目
    queryParam.recordNumber = 1000;
    /* 获取name值包含汉的这个关键字 */
    // queryParam.where = `name like '%${keyword}%'`
    queryParam.where = where; // sql
    // 3.
    //实例化地图文档查询服务对象
    var queryService = new Zondy.Service.QueryDocFeature(
      queryParam,
      service.name,
      service.layerId,
      {}
    );
    // 4.
    //执行查询操作，querySuccess为查询回调函数
    queryService.query(this.querySuccess(success));
  }
  /* fids {Array|number} */
  static queryByFids({ fids, service, success }) {
    var queryStruct = new Zondy.Service.QueryFeatureStruct();
    //是否包含几何图形信息
    queryStruct.IncludeGeometry = true;
    //是否包含属性信息
    queryStruct.IncludeAttribute = true;
    //是否包含图形显示参数
    queryStruct.IncludeWebGraphic = false;
    /* 2、查询参数 */
    //实例化查询参数对象
    var queryParam = new Zondy.Service.QueryParameter({
      objectIds: fids,
      resultFormat: "json",
      struct: queryStruct,
    });
    //设置查询分页号
    queryParam.pageIndex = 0;
    //设置查询要素数目
    queryParam.recordNumber = 20;
    /* 3、调用查询服务 */
    var queryService = new Zondy.Service.QueryDocFeature(
      queryParam,
      service.name,
      service.layerId,
      {}
    );
    //执行查询操作，querySuccess为查询回调函数
    queryService.query(this.querySuccess(success));
  }
  // 查询成功的回调
  static querySuccess(callback) {
    // console.log(1)
    return function (data) {
      console.log(data, "data");

      /* var fids = data.SFEleArray.map((item) => item.FID);
      console.log(fids, 'data_fids')
      // 注：这里的FID值，与之后转换好之后的features数组中每一项上的 .id_属性一致。
      // 从这二者身上都可以拿到FID值。不过前者为数字格式，后者为字符串格式。
      // FID也是mapgis数据库中要素自带的OID属性（字段）。 */

      var format = new Zondy.Format.PolygonJSON();
      let features_res = null;
      if (data.value) {
        // data.value是一个数组
        features_res = data.value.map((item) => format.read(item));
        features_res.isMultiLayers = true;
      } else {
        //将MapGIS要素JSON反序列化为ol.Feature类型数组
        features_res = format.read(data);
        // console.dir(features_res, "features_res");
      }
      // console.log(features_res, "features_res");
      callback(features_res);
    };
  }
}
